package com.abner.design.patterns.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理工厂
 * @author abner
 */
public class ProxyFactory {

	private Object target;

	public ProxyFactory(Object target) {
		this.target = target;
	}

	/**
	 * 获取代理对象实例
	 * @return
	 */
	public Object getProxyInstance() {

		/**
		 * 	目标对象指的是被代理的对象
		 *  loader: 指定目标对象使用的类加载器
		 *  interfaces: 目标对象实现的接口类型
		 *  h: 事情处理，执行目标对象的方法时,会触发事情处理器(invoke)方法,会把当前执行的目标对象方法作为参数传入
		 *     动态代理方法在执行时，会调用h里面的invoke方法去执行
		 *	newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
		 */
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), 
				target.getClass().getInterfaces(), 
				new InvocationHandler() {
					/**
					 * @param proxy 就是被代理对象
					 * @param method 调用的方法
					 * @param args 方法中的参数
					 * @return
					 * @throws Throwable
					 */
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("JDK代理开始---");
						// 反射机制调用目标对象的方法
						Object returnVal = method.invoke(target, args);
						System.out.println("JDK代理提交");
						return returnVal;
					}
				}); 
	}
	
	
}
